﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using ComunesMGI.DataTypes;
using ClienteWinMGI.Logica;
using ComunesMGI.Controles;
using ComunesMGI.Mensajes;
using System.IO;

namespace ClienteWinMGI.Presentacion
{
    public partial class AltaIncidente : Form
    {
        private List<DataSistema> _sistemasDeCliente;
        private List<DataCliente> _clientes;
        private TablaCamposControl _tablaCampos;
        private Dictionary<string, string> _archivosAdjuntos;

        public AltaIncidente()
        {
            InitializeComponent();
            try
            {
                cargarClientes();
                _archivosAdjuntos = new Dictionary<string, string>();
                actualizarDicdeArchivos();
                hideLoader();
            }
            catch (System.Exception ex)
            {

                Error err = new Error("Error", "Ha ocurrido un error inesperado.", ex.Message);
                err.ShowDialog();
            }
        }

        private void showLoader()
        {
            picLoader.Visible = true;
        }
        private void hideLoader()
        {
            picLoader.Visible = false;
        }


        private void cargarClientes()
        {

            List<DataCliente> ldc;
            IClientes il = LogicaFactory.getInstance().getIClientes();
            ldc = il.GetClientes();
            if (ldc.Count > 0)
            {
                comboBoxClientes.Items.Clear();
                foreach (DataCliente dc in ldc)
                {
                    comboBoxClientes.Items.Add(dc.Nombre);
                }
                _clientes = ldc;
            }

        }

        private void comboBoxClientes_SelectedIndexChanged(object sender, EventArgs e)
        {
            try
            {
                cargarSistemas(_clientes.First(dc => dc.Nombre == comboBoxClientes.SelectedItem.ToString()));
            }
            catch (System.Exception ex)
            {
                Error err = new Error("Error", "Ha ocurrido un error inesperado.", ex.Message);
                err.ShowDialog();
            }
        }

        private void buttonImpact_Click(object sender, EventArgs e)
        {
            try
            {
                showLoader();
                this.ValidateChildren();
                if (!_tablaCampos.validarCampos())
                {
                    Error err = new Error("Error", "Algunos campos contienen errores.", string.Empty);
                    err.ShowDialog();
                }
                else
                {

                    DataAltaIncidente dai;
                    IIncidentes ii = LogicaFactory.getInstance().getIIncidentes();
                    DataSistema actualDs = _sistemasDeCliente.First(ds => ds.Nombre == comboBoxSistemas.SelectedItem.ToString());
                    actualDs.Campos = _tablaCampos.getCampos();
                    if (_archivosAdjuntos.Count > 0)
                    {
                        for (int i = 0; i <= (checkLBArchivosAdjuntos.Items.Count - 1); i++)
                        {
                            if (checkLBArchivosAdjuntos.GetItemCheckState(i) == CheckState.Unchecked)
                            {
                                _archivosAdjuntos.Remove(checkLBArchivosAdjuntos.Items[i].ToString());
                            }
                        }
                        dai = ii.AddIncidente(actualDs, _archivosAdjuntos.Values.ToList());
                    }
                    else
                        dai = ii.AddIncidente(actualDs, null);

                    if (dai != null)
                    {
                        Notificacion notif = new Notificacion("Nuevo Incidente Creado", "Se ha creado correctamente el nuevo Incidente.", "El nuevo Incidente se creo para el sistema " + comboBoxSistemas.Text + " del cliente " + comboBoxClientes.Text + " con identificador= " + dai.IdIncidente + " y URL= " + dai.Url);
                        notif.ShowDialog();
                    }
                    this.Close();
                }
                hideLoader();
            }
            catch (System.Exception ex)
            {
                hideLoader();
                Error err = new Error("Error", "Ha ocurrido un error inesperado.", ex.Message);
                err.ShowDialog();
            }
        }

        private void buttonExit_Click(object sender, EventArgs e)
        {
            this.Close();
        }


        private void comboBoxSistemas_SelectedIndexChanged(object sender, EventArgs e)
        {
            bool confirm = true;
            try
            {
                if (buttonImpact.Enabled)
                {
                    if (MessageBox.Show(
                        "Si cambia de sistema perderá la información ingresada, ¿está seguro?",
                        "Confirmar cambio de sistema",
                    MessageBoxButtons.YesNo,
                        MessageBoxIcon.Question) == DialogResult.No)
                        confirm = false;
                }

                if (confirm)
                {
                    DataSistema actualDs = _sistemasDeCliente.First(ds => ds.Nombre == comboBoxSistemas.SelectedItem.ToString());
                    IIncidentes il = LogicaFactory.getInstance().getIIncidentes();
                    List<DataCampo> dataCampos = il.GetCampos(actualDs.Codigo, ComunesMGI.Enum.Lista.Incidentes);
                    if (_tablaCampos != null)
                        _tablaCampos.Dispose();
                    _tablaCampos = new TablaCamposControl(dataCampos, errorProvider1);
                    groupBoxExtras.Controls.Add(_tablaCampos);
                    buttonImpact.Enabled = true;
                    groupBox1.Enabled = true;
                }
            }
            catch (System.Exception ex)
            {
                Error err = new Error("Error", "Ha ocurrido un error inesperado.", ex.Message);
                err.ShowDialog();
            }
        }

        private void cargarSistemas(DataCliente cliente)
        {
            bool confirm = true;
            if (buttonImpact.Enabled)
            {
                if (MessageBox.Show(
                    "Si cambia de cliente perderá la información ingresada, ¿está seguro?",
                    "Confirmar cambio de cliente",
                MessageBoxButtons.YesNo,
                    MessageBoxIcon.Question) == DialogResult.No)
                    confirm = false;
                else
                {
                    buttonImpact.Enabled = false;
                    groupBox1.Enabled = false;
                    if (_tablaCampos != null)
                        _tablaCampos.Dispose();
                    groupBoxExtras.Controls.Clear();
                }
            }

            if (confirm)
            {
                List<DataSistema> lds;
                ISistemas il = LogicaFactory.getInstance().getISistemas();
                lds = il.GetSistemas(cliente.Codigo);
                comboBoxSistemas.Items.Clear();
                comboBoxSistemas.Enabled = false;

                if (lds.Count > 0)
                {
                    foreach (DataSistema ds in lds)
                    {
                        comboBoxSistemas.Items.Add(ds.Nombre);
                    }
                    _sistemasDeCliente = lds;
                    comboBoxSistemas.Enabled = true;
                }
            }
        }

        private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            if (openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                foreach (string archivo in openFileDialog1.FileNames)
                {
                    if (_archivosAdjuntos.ContainsKey(Path.GetFileName(archivo)) == true)
                    {
                        Error err = new Error("Error", "El archivo ya existe.", "Ya existe un archivo cargado con el mismo nombre, sharepoint no soporta carga multiple de archivos con mismo nombre.");
                        err.ShowDialog();
                    }
                    else
                    {
                        Label ll = new Label();
                        ll.Text = Path.GetFileName(archivo);
                        _archivosAdjuntos.Add(ll.Text, archivo);
                        agregarDicdeArchivos(ll.Text);
                    }
                }
            }
        }

        private void agregarDicdeArchivos(string file)
        {
            checkLBArchivosAdjuntos.Items.Add(file, true);
        }

        private void actualizarDicdeArchivos()
        {
            checkLBArchivosAdjuntos.Items.Clear();
            foreach (string s in _archivosAdjuntos.Keys)
            {
                checkLBArchivosAdjuntos.Items.Add(s, true);
            }
        }

        private void butAdjuntarArchivos_Click(object sender, EventArgs e)
        {
            if (openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                foreach (string archivo in openFileDialog1.FileNames)
                {
                    /*if (!_archivosAdjuntos.Exists(delegate(string x)
                    
                    {
                        return x == archivo;
                    }))*/
                    if (_archivosAdjuntos.ContainsKey(Path.GetFileName(archivo)) == true)
                    {
                        Error err = new Error("Error", "El archivo de nombre " + Path.GetFileName(archivo) + " ya existe.", "Ya existe un archivo cargado con el mismo nombre, sharepoint no soporta carga multiple de archivos con mismo nombre.");
                        err.ShowDialog();
                    }
                    else
                    {
                        Label ll = new Label();
                        ll.Text = Path.GetFileName(archivo);
                        _archivosAdjuntos.Add(ll.Text, archivo);
                        //flowLayoutPanel1.Controls.Add(ll);
                        agregarDicdeArchivos(ll.Text);
                    }
                }
            }
        }

        private void butEliminarDeseleccionados_Click(object sender, EventArgs e)
        {
            for (int i = 0; i <= (checkLBArchivosAdjuntos.Items.Count - 1); i++)
            {
                if (checkLBArchivosAdjuntos.GetItemCheckState(i) == CheckState.Unchecked)
                {
                    _archivosAdjuntos.Remove(checkLBArchivosAdjuntos.Items[i].ToString());
                    checkLBArchivosAdjuntos.Items.RemoveAt(i);
                }
            }
        }
    }
}
